package tiers3.services;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import tiers3.constants.Constantes;

import common.Tweet;
import common.Utilisateur;

public class ServicePersistanceImpl implements IServicePersistance {

	/**
	 * Création d'un nouvel utilisateur
	 */
	@Override
	public Utilisateur creerUtilisateur(Utilisateur utilisateur)
			throws RemoteException {
		try {
			// Attribution d'un id � l'utilisateur
			utilisateur.setId( new Random().nextInt(99999));
			FileOutputStream fileOutputStream;
			fileOutputStream = new FileOutputStream(Constantes.FOLDER
					+ Constantes.UTILISATEUR_PREFIXE_SERIALISATION
					+ utilisateur.getId() + Constantes.SUFFIXE_BIN);
			ObjectOutputStream objectOutputStream = new ObjectOutputStream(
					fileOutputStream);
			objectOutputStream.writeObject(utilisateur);
			objectOutputStream.flush();
			objectOutputStream.close();

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return utilisateur;
	}

	/**
	 * Création d'un tweet en fonction de l'utilisateur
	 */
	@Override
	public Tweet creerTweet(Utilisateur utilisateur, Tweet tweet)
			throws RemoteException {
		try {
			utilisateur.ajoutTweet(tweet);

			// Récupération et vérification du dossier de stockage des
			// utilisateurs
			File repertoire = new File(Constantes.FOLDER);
			assert repertoire.isDirectory();
			FileOutputStream fileOutputStream;
			fileOutputStream = new FileOutputStream(Constantes.FOLDER
					+ Constantes.UTILISATEUR_PREFIXE_SERIALISATION
					+ utilisateur.getId() + Constantes.SUFFIXE_BIN);
			ObjectOutputStream objectOutputStream = new ObjectOutputStream(
					fileOutputStream);
			objectOutputStream.writeObject(utilisateur);
			objectOutputStream.flush();
			objectOutputStream.close();
			return tweet;
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	
	}

	@Override
	public boolean modifierUtilisateur() throws RemoteException {
		return false;
	}

	/**
	 * Retourne la liste de tous les utilisateurs de l'application
	 */
	@Override
	public List<Utilisateur> rechercherTousUtilisateurs()
			throws RemoteException {
		// Instanciation d'une liste d'utilisateurs vide par défaut
		List<Utilisateur> maListeUtilisateur = new ArrayList<Utilisateur>();
		Utilisateur unUtilisateur;

		// Récupération et vérification du dossier de stockage des utilisateurs
		File repertoire = new File(Constantes.FOLDER);
		assert repertoire.isDirectory();

		// Récupération de l'ensemble des fichier contenus dans le répertoire
		File[] tousLesFichiers = repertoire.listFiles();
		if (tousLesFichiers != null) {
			for (File fichier : tousLesFichiers) {
				if (!fichier.isDirectory()) {

					FileInputStream fileInputStream;
					try {
						fileInputStream = new FileInputStream(fichier.getPath());
						ObjectInputStream objectInputStream = new ObjectInputStream(
								fileInputStream);

						maListeUtilisateur.add((Utilisateur) objectInputStream
								.readObject());

						fileInputStream.close();
						objectInputStream.close();
					} catch (FileNotFoundException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (ClassNotFoundException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

				}
			}
		}
		return maListeUtilisateur;
	}

	/**
	 * Retourne la liste de tous les tweets de l'application
	 */
	@Override
	public List<Tweet> rechercherTousTweets() throws RemoteException {
		List<Tweet> listeTweets = new ArrayList<Tweet>();

		for (Utilisateur utilisateur : rechercherTousUtilisateurs()) {
			listeTweets.addAll(utilisateur.getListeTweets());
		}

		return listeTweets;
	}

	@Override
	public List<Tweet> rechercherTweetsParUtilisateur(Utilisateur utilisateur)
			throws RemoteException {
		return utilisateur.getListeTweets();
	}

	@Override
	public Utilisateur rechercherUtilisateur(int id, String nom, String prenom,
			String login, String motDePasse) throws RemoteException {

		return null;
	}

	public Utilisateur rechercherUtilisateurParId(int idUtilisateur)
			throws RemoteException {
		List<Utilisateur> listeUtilisateurs = rechercherTousUtilisateurs();
		// Pour chaque utilisateur on recherche l'utilisateur
		for (Utilisateur utilisateur : listeUtilisateurs) {
			if (utilisateur.getId() == idUtilisateur) {
				return utilisateur;
			}
		}
		return null;
	}

	@Override
	public Utilisateur rechercherUtilisateurParLoginMdp(String login,
			String motDePasse) throws RemoteException {
		List<Utilisateur> listeUtilisateurs = new ArrayList<Utilisateur>(); // appel�
																			// la
																			// m�thode
																			// getListUtilisateurs;
		for (Utilisateur utilisateur : listeUtilisateurs) {
			if (login == utilisateur.getLogin()
					&& motDePasse == utilisateur.getMdp()) {
				return utilisateur;
			}
		}
		return null;
	}

	@Override
	public List<Utilisateur> rechercherUtilisateurParNom(String nom)
			throws RemoteException {
		List<Utilisateur> listeUtilisateurs = new ArrayList<Utilisateur>(); // appel�
																			// la
																			// m�thode
																			// getListUtilisateurs;
		List<Utilisateur> listeRetour = new ArrayList<Utilisateur>();
		for (Utilisateur utilisateur : listeUtilisateurs) {
			if (nom == utilisateur.getNom()) {
				listeRetour.add(utilisateur);
			}
		}
		return listeRetour;
	}

	@Override
	public List<Utilisateur> rechercherUtilisateurParPrenom(String prenom)
			throws RemoteException {
		List<Utilisateur> listeUtilisateurs = new ArrayList<Utilisateur>(); // appel�
																			// la
																			// m�thode
																			// getListUtilisateurs;
		List<Utilisateur> listeRetour = new ArrayList<Utilisateur>();
		for (Utilisateur utilisateur : listeUtilisateurs) {
			if (prenom == utilisateur.getPrenom()) {
				listeRetour.add(utilisateur);
			}
		}
		return listeRetour;
	}
}
